#pragma once
#include <iostream>
#include <functional>
#include <unordered_map>
#include "TcpServer.hpp"
#include "HttpProtocol.hpp"

using namespace TcpServerModule;
using fun_t = std::function<void(HttpRequest&, HttpResponse&)>;

class HttpServer
{
public:
	HttpServer(int post) : _hserv(std::make_unique<TcpServer>(post))
	{
	}
	void Resgiter(std::string name, fun_t fun)
	{
		_fun_map[name] = fun;
	}

	void start()
	{
		_hserv->SetHandler([this](Sockptr sock, Inetaddr addr)
						   { return this->HandlerHttpRequest(sock, addr); });
		_hserv->Loop();
	}
	bool SafeCheck(const std::string &service)
    {
        auto iter = _fun_map.find(service);
        return iter != _fun_map.end();
    }
	// 处理数据             // 文件描述符   客户端信息
	bool HandlerHttpRequest(Sockptr sock, Inetaddr addr)
	{
		std::string http_request;
		sock->Recv(&http_request);
		std::cout << http_request; // 字节流的请求
		// 对数据进行反序列化
		HttpRequest req;
		req.Deserialize(http_request);
		req.Print(); // 打印请求信息
		// 对数据进行处理
		HttpResponse resq;
		
		// 请求应该被分成两类: 1. 请求一般的静态资源 2. 提交参数，携带参数，需要我们进行交互设置
		if(req.IsHasArgs())
		{
			// 2. 提交参数，携带参数，需要我们进行交互设置
			std::cout <<"11111111111111111111111111111111111111111111111111"<<std::endl;

			std::cout << req.Path() << std::endl;
			std::cout << req.Args() << std::endl;
			std::cout <<"11111111111111111111111111111111111111111111111111"<<std::endl;

			std::string service = req.Path();
            if (SafeCheck(service))
			{
				std::cout <<"11111111111111111111111111111111111111111111111111"<<std::endl;
				std::cout << "service: " << service << std::endl;
				std::cout <<"11111111111111111111111111111111111111111111111111"<<std::endl;

                _fun_map[req.Path()](req, resq); // /login

			}
            else
                resq.build(req); // debug
		}
		else
		{
			resq.build(req);
		}


		// 对数据进行序列化
		std::string resquest_out;
		resq.serialize(&resquest_out);
		// 发送响应
		sock->Send(resquest_out);
		return true;
	}
	~HttpServer()
	{
	}

private:
	std::unique_ptr<TcpServer> _hserv;
	// 功能路由
	std::unordered_map<std::string,fun_t> _fun_map;
};



// 解析请求，获取请求方法、请求路径、请求参数、请求头、请求体...
// HttpRequest request;
// request.Deserialize(http_request);
// request.Print(); //打印请求信息

// 读取请求，对请求进行分析处理 --> 文本处理！
// 1. 读取请求的完整性 --- 暂时不做
// 2. 完整http反序列化，http response序列化...
// demo 1 : 直接返回一个固定的内容
// std::string status_line = "HTTP/1.1 200 OK" + Sep + BlankLine;

// 直接返回一个html网页
// std::string body = "<!DOCTYPE html>\
        //                     <html>\
        //                    <head>\
        //                    <meta charset = \"UTF-8\">\
        //                    <title> hello李宣佳大傻逼 </title>\
        //                    </head>\
        //                    <body>\
        //                    <p> hello李宣佳大傻逼</ p>\
        //                    </body> </html>";

// std::string httpresponse = status_line + body;
// sock->Send(httpresponse);
// return true;

// 直接返回一个html网页
// std::string body = "<!DOCTYPE html>\
        //                     <html>\
        //                    <head>\
        //                    <meta charset = \"UTF-8\">\
        //                    <title> hello李宣佳大傻逼 </title>\
        //                    </head>\
        //                    <body>\
        //                    <p> hello李宣佳大傻逼</ p>\
        //                    </body> </html>";
// std::stringstream ss;
// ss << "<!DOCTYPE html>\n"
//    << "<html lang=\"zh-CN\">\n"
//    << "<head>\n"
//    << "  <meta charset=\"UTF-8\">\n"
//    << "  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n"
//    << "  <title>外卖点单系统</title>\n"
//    << "  <style>\n"
//    << "    /* 全局样式 */\n"
//    << "    body {\n"
//    << "      font-family: Arial, sans-serif;\n"
//    << "      margin: 0;\n"
//    << "      padding: 0;\n"
//    << "      background-color: #f4f4f4;\n"
//    << "    }\n"
//    << "\n"
//    << "    /* 容器样式 */\n"
//    << "   .container {\n"
//    << "      width: 80%;\n"
//    << "      margin: 0 auto;\n"
//    << "    }\n"
//    << "\n"
//    << "    /* 标题样式 */\n"
//    << "    h1 {\n"
//    << "      text-align: center;\n"
//    << "      color: #333;\n"
//    << "    }\n"
//    << "\n"
//    << "    /* 登录注册表单样式 */\n"
//    << "    form {\n"
//    << "      background-color: white;\n"
//    << "      padding: 20px;\n"
//    << "      border-radius: 5px;\n"
//    << "      box-shadow: 0 0 5px rgba(0, 0, 0, 0.1);\n"
//    << "      margin-bottom: 20px;\n"
//    << "    }\n"
//    << "\n"
//    << "    label {\n"
//    << "      display: block;\n"
//    << "      margin-bottom: 5px;\n"
//    << "    }\n"
//    << "\n"
//    << "    input[type=\"text\"],\n"
//    << "    input[type=\"password\"] {\n"
//    << "      width: 100%;\n"
//    << "      padding: 8px;\n"
//    << "      margin-bottom: 15px;\n"
//    << "      border: 1px solid #ccc;\n"
//    << "      border-radius: 3px;\n"
//    << "    }\n"
//    << "\n"
//    << "    button {\n"
//    << "      background-color: #007BFF;\n"
//    << "      color: white;\n"
//    << "      padding: 10px 15px;\n"
//    << "      border: none;\n"
//    << "      border-radius: 3px;\n"
//    << "      cursor: pointer;\n"
//    << "    }\n"
//    << "\n"
//    << "    button:hover {\n"
//    << "      background-color: #0056b3;\n"
//    << "    }\n"
//    << "\n"
//    << "    /* 外卖商品展示样式 */\n"
//    << "   .product {\n"
//    << "      background-color: white;\n"
//    << "      padding: 20px;\n"
//    << "      border-radius: 5px;\n"
//    << "      box-shadow: 0 0 5px rgba(0, 0, 0, 0.1);\n"
//    << "      margin-bottom: 15px;\n"
//    << "      display: flex;\n"
//    << "      justify-content: space-between;\n"
//    << "      align-items: center;\n"
//    << "    }\n"
//    << "\n"
//    << "   .product img {\n"
//    << "      width: 80px;\n"
//    << "      height: 80px;\n"
//    << "      margin-right: 10px;\n"
//    << "    }\n"
//    << "\n"
//    << "   .product h3 {\n"
//    << "      margin: 0;\n"
//    << "    }\n"
//    << "\n"
//    << "   .product p {\n"
//    << "      margin: 5px 0;\n"
//    << "      color: #666;\n"
//    << "    }\n"
//    << "  </style>\n"
//    << "</head>\n"
//    << "<body>\n"
//    << "  <div class=\"container\">\n"
//    << "    <h1>外卖点单系统</h1>\n"
//    << "    <!-- 登录注册表单 -->\n"
//    << "    <form id=\"loginForm\">\n"
//    << "      <h2>登录</h2>\n"
//    << "      <label for=\"username\">用户名:</label>\n"
//    << "      <input type=\"text\" id=\"username\" placeholder=\"请输入用户名\">\n"
//    << "      <label for=\"password\">密码:</label>\n"
//    << "      <input type=\"password\" id=\"password\" placeholder=\"请输入密码\">\n"
//    << "      <button type=\"button\">登录</button>\n"
//    << "      <p>还没有账号？<a href=\"#\" onclick=\"document.getElementById('loginForm').style.display='none';document.getElementById('registerForm').style.display='block';\">注册</a></p>\n"
//    << "    </form>\n"
//    << "    <form id=\"registerForm\" style=\"display: none;\">\n"
//    << "      <h2>注册</h2>\n"
//    << "      <label for=\"newUsername\">用户名:</label>\n"
//    << "      <input type=\"text\" id=\"newUsername\" placeholder=\"请输入用户名\">\n"
//    << "      <label for=\"newPassword\">密码:</label>\n"
//    << "      <input type=\"password\" id=\"newPassword\" placeholder=\"请输入密码\">\n"
//    << "      <label for=\"confirmPassword\">确认密码:</label>\n"
//    << "      <input type=\"password\" id=\"confirmPassword\" placeholder=\"请再次输入密码\">\n"
//    << "      <button type=\"button\">注册</button>\n"
//    << "      <p>已有账号？<a href=\"#\" onclick=\"document.getElementById('loginForm').style.display='block';document.getElementById('registerForm').style.display='none';\">登录</a></p>\n"
//    << "    </form>\n"
//    << "    <!-- 外卖商品展示 -->\n"
//    << "    <h2>外卖商品</h2>\n"
//    << "    <div class=\"product\">\n"
//    << "      <div>\n"
//    << "        <img src=\"https://via.placeholder.com/80\" alt=\"美食图片\">\n"
//    << "        <h3>鱼香肉丝盖饭</h3>\n"
//    << "        <p>价格: 15元</p>\n"
//    << "      </div>\n"
//    << "      <button>加入购物车</button>\n"
//    << "    </div>\n"
//    << "    <div class=\"product\">\n"
//    << "      <div>\n"
//    << "        <img src=\"https://via.placeholder.com/80\" alt=\"美食图片\">\n"
//    << "        <h3>宫保鸡丁</h3>\n"
//    << "        <p>价格: 18元</p>\n"
//    << "      </div>\n"
//    << "      <button>加入购物车</button>\n"
//    << "    </div>\n"
//    << "  </div>\n"
//    << "</body>\n"
//    << "</html>";

// std::string body = ss.str();
